package esc1Caso1;

import comun.Fichero;
import comun.GeneradorProblemas;

import aima.search.framework.Problem;
import aima.search.framework.Search;
import aima.search.framework.SearchAgent;
import aima.search.informed.HillClimbingSearch;
import aima.search.informed.SimulatedAnnealingSearch;
import IA.DistFS.Servers.WrongParametersException;

public class Main {

    public static void main(String [] args){
    	long tiempoIni = System.currentTimeMillis();
    	int numPruebas = 1;
    	
        GeneradorProblemas generador = new GeneradorProblemas();
        try {
        	Fichero f = new Fichero("fichero1");
        	Fichero f2 = new Fichero("fichero2");
        	for(int i = 0; i < numPruebas; i++){
        		//Genera el estado inicial
                generador.generarExperimento1();
                //Estado caso1 = new Estado(generador.getPeticiones(), generador.getServidores(), generador.getNumServidores());
                Estado caso1b = new Estado(generador.getPeticiones(), generador.getServidores(), generador.getNumServidores());
                //caso1.generarEstadoInicialAleatorio();
                caso1b.generarEstadoInicialMenorTiempo();
                //System.out.println("Aleatorio: Tiempo maximo de partida: " + caso1.getTiempoMaximo());
                System.out.println("Mejor tiempo: Tiempo maximo de partida: " + caso1b.getTiempoMaximo());
                
                //Crea y resuelve el problema
                //Problem problema = new Problem(caso1, new FuncionSuccesores(false), new EsEstadoFinal() , new Heuristico());
                //Search algoritmo = new HillClimbingSearch();
                //SearchAgent agent = new SearchAgent(problema, algoritmo);
                
                //Crea y resuelve el problema
                Problem problemab = new Problem(caso1b, new FuncionSuccesores(false), new EsEstadoFinal() , new Heuristico());
                Search algoritmob = new SimulatedAnnealingSearch(1000,20,30,0.3);
                SearchAgent agentb = new SearchAgent(problemab, algoritmob);
                
                //Estado resultado = (Estado) algoritmo.getGoalState();
                //System.out.println("Aleatorio: Tiempo maximo final: " + resultado.getTiempoMaximo());
                Estado resultadob = (Estado) algoritmob.getGoalState();
                System.out.println("Mejor tiempo: Tiempo maximo final: " + resultadob.getTiempoMaximo());
                
                //Escribir en fichero
                //f.escribe(String.valueOf(resultado.getTiempoMaximo()));
                f2.escribe(String.valueOf(resultadob.getTiempoMaximo()));
        	}
            f.cierraF();
            f2.cierraF();
            System.out.println("FIN");
            long tiempoFinal = System.currentTimeMillis();
            System.out.println("diferencia de tiempos: " + (tiempoFinal-tiempoIni));
            //System.out.println("expansion de nodos" + resultadob.getMetrix());
        } catch (WrongParametersException e) {
                e.printStackTrace();
        } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
            
            
    }
}
